package adapter;


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.uqbar.commons.model.ObservableObject;
import org.uqbar.commons.model.UserException;

import apuesta.Apuesta;
import apuesta.Pleno;
import apuesta.TipoApuesta;

import Ruleta.Mesa;
import jugador.Jugador;
import jugador.Persona;

public class MesaAdapter extends ObservableObject{
	
	private Mesa mesa;
	
	private Jugador jugadorActual;
	private String nombre;
	private int dinero;
	private int numeroActual;
	private List<Jugador> jugadores= new LinkedList<Jugador>();
	private List<Apuesta> apuestas= new LinkedList<Apuesta>();
	
	private int fichasACambiar;
	private int fichasJugadorActual;
	private String nombreJugadorActual;
	
	private TipoApuesta tipoApuesta;
	private int cantidadParaApostar;
	private int numeroApostado;
	
	
	//VARIABLES DE INSTANCIA
	
	
	public static final String FICHAS = "fichasJugadorActual";
	public static final String NOMBREACTUAL = "nombreJugadorActual";
	public static final String FICHASPARACAMBIAR = "fichasACambiar";
	public static final String JUGADORES="jugadores";
	public static final String APUESTAS="apuestas";
	public static final String SELECTED = "jugadorActual";
	public static final String NUMEROACTUAL = "numeroActual";	
	public static final String NOMBRE = "nombre";
	public static final String DINERO = "dinero";
	
	
	//METODOS
	public static final String GIRAR = "girar";
	public static final String PAGARAPUESTAS = "pagarApuestas";
	public static final String RETIRARSE="retirarse";
	public static final String CAMBIARFICHAS="cambiarfichas";
	public static final String NOVAMAS="noVaMas";
	public static final String ACTUALIZARJUGADOR = "actualizarJugador";
	public static final String UNIRSE = "unirse";
	
	
	
	
	//Apuesta
	
	public static final String APOSTAR="apostar";
	public static final String TIPOAPUESTA = "tipoApuesta";
	public static final String CANTIDADPARAAPOSTAR = "cantidadParaApostar";
	public static final String NUMEROAPOSTADO = "numeroApostado";
	
	
	
	
	
	//CONSTRUCTORES
	public Mesa getMesa() {
		
		return mesa;
	}


	public MesaAdapter(int i) {
		
		this.mesa = new Mesa(i);
		Persona persona1= new Persona("Mateo",1000);
		
		Persona persona2= new Persona("Raul",100);
		
		this.mesa.unirse(persona1);
		this.mesa.unirse(persona2);
		
		

	}
	
	//GETTERS & SETTERS
	
	
	public String getNombreJugadorActual() {
		return nombreJugadorActual;
	}
	
	public List<Apuesta> getApuestas() {
		return this.mesa.getApuestasActuales();
	}

	
	public void setApuestas(List<Apuesta> apuestas) {
		this.apuestas = apuestas;
	}


	public List<Jugador> getJugadores() {
		return this.mesa.getJugadores();
	}


	public void setJugadores(List<Jugador> jugadores) {
		this.jugadores = jugadores;
	}	
	
	
	public void setNombreJugadorActual(String nombreActual) {
		this.setFieldValue(NOMBREACTUAL, nombreActual);
	}


	public String getJugadorNombreActual() {
		return nombreJugadorActual;
	}

	public void setFichasJugadorActual(int fichasJugadorActual) {
		this.setFieldValue(FICHAS, fichasJugadorActual);
	}


	public int getFichasJugadorActual() {
		return fichasJugadorActual;
	}
	
	public void setFichasACambiar(int fichasACambiar) {
		
		this.setFieldValue(FICHASPARACAMBIAR, fichasACambiar);

	}


	public int getFichasACambiar() {
		return fichasACambiar;
	}
	

	public TipoApuesta getTipoApuesta() {
		return tipoApuesta;
	}


	public void setTipoApuesta(TipoApuesta tipoApuesta) {
		
		this.setFieldValue(TIPOAPUESTA, tipoApuesta);
		
	}


	public int getCantidadParaApostar() {
		return cantidadParaApostar;
	}


	public void setCantidadParaApostar(int cantidadParaApostar) {
		
		this.setFieldValue(CANTIDADPARAAPOSTAR, cantidadParaApostar);
		
		System.out.println("Se bindeo la cantidad de " + cantidadParaApostar);
	}


	public int getNumeroApostado() {
		return numeroApostado;
	}


	public void setNumeroApostado(int numeroApostado) {
		
		this.setFieldValue(NUMEROAPOSTADO, numeroApostado);
		System.out.println("Se bindeo el numero " + numeroApostado);
	}
	
	
	
	public String getNombre() {
		return nombre;
	}


	public void setNombre(String nombre) {
		this.setFieldValue(NOMBRE, nombre);
	}


	public int getDinero() {
		return dinero;
	}


	public void setDinero(int dinero) {
		this.setFieldValue(DINERO, dinero);
	}

	public MesaAdapter(){}
	
	
	public void setMesa(Mesa mesa) {
		this.mesa = mesa;
	}

	
	//JUGADORES esta bindeado a una property de mesa, pero jugadorActual NO


	public Jugador getJugadorActual() {
		return jugadorActual;

	}


	public void setJugadorActual(Jugador jugadorActual) {
		
		this.setFieldValue(SELECTED, jugadorActual);
		this.setFichasJugadorActual(jugadorActual.getFichas());
		this.setNombreJugadorActual(jugadorActual.getNombre());
		System.out.println("se setea a:" + this.jugadorActual.getNombre());
	}

	public void setNumeroActual(int numeroActual) {
		this.setFieldValue(NUMEROACTUAL, numeroActual);
	}

	public int getNumeroActual() {
		return numeroActual;
	}

	//MÉTODOS
	

	
	public void unirse(){
		
		Persona person=new Persona(this.nombre,this.dinero);
		this.mesa.unirse(person);
		this.firePropertyChange(JUGADORES, null, this.getJugadores());
		this.dinero=0;
		this.nombre=null;
		
	}
	
	public void noVaMas(){

		this.girar();
		this.mesa.noVaMas();
		
	}
	
	public int girar(){
		
		int nro = this.mesa.girar();
		this.setNumeroActual(nro);
		return nro;
	}
	
	public void apostar(){
		
		if(this.fichasJugadorActual < this.cantidadParaApostar){
			
			
			throw new UserException("Usted no dispone de dinero suficiente");
		
		
	}
		
		this.mesa.apostar(this.jugadorActual, this.tipoApuesta, this.numeroApostado, this.cantidadParaApostar);
		this.firePropertyChange(APUESTAS, null, this.getApuestas());
		
		//Seteo el cambio en el jugador
		this.setFieldValue(FICHAS, this.jugadorActual.getFichas());
		

		this.setTipoApuesta(null);
		this.setNumeroApostado(0);
		this.setCantidadParaApostar(0);
		
		
	}
	public void pagarApuestas(){
		this.mesa.chequearApuestasGanadoras();
		this.setFieldValue(FICHAS, this.jugadorActual.getFichas());
		this.firePropertyChange(APUESTAS, null, this.getApuestas());
		
		
	}
	
	public void retirarse(){
		this.mesa.retirarse(jugadorActual);
		this.setFieldValue(SELECTED, null);
		this.setFieldValue(NOMBREACTUAL, null);
		this.setFieldValue(FICHAS, 0);
		this.firePropertyChange(JUGADORES, null, this.getJugadores());
	}
	
	public void actualizarJugador(){
		
		this.setFieldValue(FICHAS, this.jugadorActual.getFichas() + fichasACambiar);
		this.jugadorActual.setFichas(this.jugadorActual.getFichas() + fichasACambiar);
		this.setFichasACambiar(0);
		
		
	}	
}
